ICTSC2018 本戦 問題解説: IPv6アドレス割当方式の移行に失敗した

問題文

あなたの部署では IPv6 のネットワークを使用しており、ルータ以下に fd00:10::/64fd00:11::/64 の2つのサブネットがあり、それぞれのサブネットに端末がある。fd00:10::/64 には端末1が存在し fd00:11::/64 には端末2が存在している。

fd00:11::/64 のサブネットでは今まで静的に IPv6 アドレスを割り当てていたが、自動的な割り当てに切り替えることになった。ところが、切り替え作業時にオペレーションミスが発生してしまい、端末2が IPv6 アドレスを失ってしまったらしく、端末1から端末2へアクセスできなくなってしまった。

この状態から切り替え作業を完了させ、端末2に fd00:11::/64 の IPv6 アドレスを自動的に割り当てて端末1からアクセスできるようにしてほしい。なお端末2のアドレスとしては fd00:11::100 - fd00:11::199 の範囲のみが使用を許可されている。

情報

ルータ

IPアドレス: 192.168.10.1
ユーザー: admin
パスワード: w4HcAsJS

端末1

IPアドレス: fd00:10::2
ユーザー: admin
パスワード: w4HcAsJS

ルータからアクセスすることが可能です。

端末2

ユーザー: admin
パスワード: w4HcAsJS

構成

10_ryo_image.png.webp

トラブルの概要

  • 端末2に静的に割り当てていた IPv6 アドレスが消えている
  • DHCPv6 の設定が入っていない

解説・解答例

まず、問題文を読めば以下の事項が要求されているとわかります。

  1. サーバ2に自動的にIPv6アドレスを割り当てる
  2. 自動的に割り当てるIPV6アドレスは fd00:11::100 - fd00:11::199 でなければならない

IPv4であれば、自動的にアドレスを割り当てる場合にはDHCPを利用します。一方でIPv6アドレスを自動的に割り当てる方法としては以下の二つがあります。

  1. Router Advertisement (RA) を利用したステートレス自動割り当て
  2. DHCPv6 を利用したステートフル自動割り当て

ステートレス自動割り当てではサーバがルータからRAというメッセージを受け取り、RAで配布された情報とサーバのインターフェースのMACアドレスを組み合わせてIPv6アドレスを生成します。そのため、特定の範囲内のアドレスを使わせることが不可能です。したがってDHCPv6を使わなければならないことがわかります。

そこでルータの fd00:11::/64 のインターフェースにDHCPv6の設定を行いましょう。

まずはルータにsshします。

$ ssh [email protected]
Welcome to VyOS

sshの際にルータがVyOS であることがわかります。VyOS のコマンドで設定していきましょう。

$ show conf
ethernet eth2 {
address fd00:11::1/64
duplex auto
smp_affinity auto
speed auto
}

コンフィグを見るとeth2fd00:11::/64のインターフェースだとわかります。

$ conf
$ set service dhcpv6-server
$ set service dhcpv6-server shared-network-name eth2 subnet fd00:11::/64 address-range start fd00:11::100 stop fd00:11::199
$ edit interfaces ethernet eth2
$ set ipv6 router-advert send-advert true
$ set ipv6 router-advert managed-flag true
$ set ipv6 router-advert other-config-flag true
$ exit
$ commit; save

address-rangeでIPv6アドレスの範囲を指定します。これは、問題文に指定されている通り fd00:11::100 - fd00:11::199 にしましょう。

またeth2においてRAを有効にします。これは、DHCPv6による割り当てを使う場合でもまずはサーバがルータからRAを受け取る必要があるからです。DHCPv6でIPv6アドレスを配布するにはさらにmanaged-flagを有効にする必要があります。other-config-flagはDHCPv6サーバでネームサーバなどの情報を配布するかどうかのオプションであるため、ここでは有効にしていますが、無効でも良いです。なお VyOS ではother-config-flagに関わらず、デフォルトゲートウェイがRAを配布したインターフェースに設定されるようです。

さて、これでサーバ2にアドレスが割り振られるはずなので見てみましょう。以下のコマンドで割り当てられてい DHCPv6アドレスを確認することができます。

$ show dhcpv6 server leases
There are no DHCPv6 leases.

ところが、予想に反して、割り当てられているIPv6アドレスがありません。ルータとサーバ2の間に何らかのトラブルが発生していることが想定されます。サーバ2にsshしてトラブルシューティングを行いたいところです。しかし「サーバ2が IPv6 アドレスを失ってしまったらしく、サーバ1からサーバ2へアクセスできなくなってしまった」とあるように、サーバ2に割り当てられていた静的なIPv6アドレスは失われてしまっています。

ここで、IPv6のリンクローカルアドレスを使います。IPv6が有効になっている全てのインターフェースには、MACアドレスから自動生成されたリンクローカルアドレスが割り当てられています。これは、その名の通り同じL2にいるインターフェース同士の通信に使用することができます。したがって、ルータからであればサーバ2のリンクローカルアドレスにアクセスすることができます。

サーバ2のリンクローカルアドレスはわからないので探しましょう。そのためには、IPv6のマルチキャストが有効です。IPv6にはリンクローカルなマルチキャストアドレスがあらかじめいくつか定義されており、同じL2に存在する特定の種類のインターフェース全てに通信することができます。ここでは、リンクローカルな全てのノードのアドレスを調べるためにeth2からff02::1に ping します。

$ ping6 -I eth2 ff02::1

これを実行すると1つ以上のインターフェースから応答があるはずです。なお、一度通信したことのあるインターフェースのアドレスは以下のコマンドでも調べられます。RAを有効にした後であれば、上記のpingのマルチキャストを行わなくても複数のインターフェースを見つけられるかもしれません。

$ show ipv6 neigh

ここまででサーバ2のインターフェースの候補がわかるはずなので、あとは地道にsshを試していきます。与えられたユーザとパスワードでログインできるのがサーバ2です。なお、リンクローカルアドレスにsshするときはアドレスの末尾に%eth2を追記して、インターフェースを明示する必要があります。

$ ssh admin@{{link local address}}%eth2
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-45-generic x86_64)

ログインに成功するとUbuntu 18.04であることがわかります。iproute2のコマンドでインターフェースを見ると、アドレスが振られていないのがわかります。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:5e:e0:21:7e brd ff:ff:ff:ff:ff:ff
inet6 fe80::5054:5eff:fee0:217e/64 scope link
valid_lft forever preferred_lft forever

Ubuntu 18.04ではネットワークインターフェースの管理にNetplanというソフトウェアを使っています。設定ファイルは/etc/netplan/以下にあります。今回は/etc/netplan/99-network-config.yamlが存在し、以下のように書かれています。

network:
version: 2
ethernets:
eth0:
dhcp4: false
accept-ra: false
gateway6: fd00:11::1

ここからRAが無効になっているとわかります。これではDHCPv6によるアドレス割り当てを行うことができません。そこで、RAとDHCPv6を有効にします。また、ゲートウェイはRAによって設定されるので、静的な設定は消してしまいます。

network:
version: 2
ethernets:
eth0:
dhcp4: false
dhcp6: true
accept-ra: true

書き換えて保存したら、以下のコマンドで設定を反映させます。

$ sudo netplan apply

すると今度はDHCPv6によって割り当てられたアドレスが確認できるはずです。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:5e:e0:21:7e brd ff:ff:ff:ff:ff:ff
inet6 fd00:11::199/128 scope global dynamic noprefixroute
valid_lft 43196sec preferred_lft 26996sec
inet6 fe80::5054:5eff:fee0:217e/64 scope link
valid_lft forever preferred_lft forever

問題が解決したかどうか確かめるために、サーバ1からこのアドレスにpingしてみましょう。

$ ssh admin@fd00:10::2
$ ping fd00:11::199
PING fd00:11::199(fd00:11::199) 56 data bytes
64 bytes from fd00:11::199: icmp_seq=1 ttl=63 time=1.38 ms
64 bytes from fd00:11::199: icmp_seq=2 ttl=63 time=1.17 ms

成功していれば、問題解決です。当初の目的通りに、サーバ2に特定の範囲のIPv6アドレスを自動的に割り当てることができました。

採点基準

想定解法の場合

  • サーバでRAを設定している: 60点
  • サーバでDHCPv6を設定している: 70点
  • 端末2にリンクローカルアドレスで接続している: 70点
  • クライアントを正しく設定している: 40点

その他の解法の場合

  • IPv6アドレスが正しく割り当てられている: 140点
  • 端末1から端末2へpingが通る: 100点

参考

この問題を解く、あるいは解説を理解するにあたって参考となるウェブページを上げておきます。

  • RAとDHCPv6について: https://www.infraexpert.com/study/ipv6z5.html
  • IPv6ユニキャストアドレスについて: https://www.infraexpert.com/study/ipv6z3.html
  • IPv6マルチキャストアドレスについて: https://www.infraexpert.com/study/ipv6z10.html